package com.mySpringMvc.web.servlet.mvc.method.annotation;

import com.mySpringMvc.ui.ModalMap;
import com.mySpringMvc.web.method.HandlerMethod;
import com.mySpringMvc.web.servlet.HandlerAdapter;
import com.mySpringMvc.web.servlet.ModalAndView;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.lang.reflect.Method;

/**
 * @program: mySSM
 * @description: 处理器适配器，专用于@RequestMapping注解标注的处理器方法（适配器模式，负责调用处理器方法时进行数据的绑定，参数的出入等操作）
 * @author:wjp
 * @create: 2025-02-13 18:21
 **/
public class RequestMappingHandlerAdapter implements HandlerAdapter {
    @Override
    public ModalAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        // 此处实例直接写死，实际需要进行数据绑定，参数构造，方法调用等，例如将form表单提交的数据转为pojo
//        ModalAndView modalAndView = new ModalAndView();
//        // 构造model数据
//        ModalMap modalMap = new ModalMap();
//        modalMap.put("username","zhangsan");
//        modalAndView.setModalMap(modalMap);
//        // 构造逻辑视图名称
//        modalAndView.setViewName("index");

        // 此处的handler实际为handlerMethod对象
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        // controller对象
        Object controller = handlerMethod.getHandler();
        // 执行方法
        Method method = handlerMethod.getMethod();
        // 通过反射机制调用(假设controller方法参数都有modalMap参数，返回的都是逻辑视图名称)
        ModalMap modalMap = new ModalMap();
        // 此处的modalMap将会传递给实际调用的方法，并且实际调用的方法可以操作该modalMap（放入数据并返回）
        String viewName = (String) method.invoke(controller,modalMap);

        ModalAndView modalAndView = new ModalAndView();
        modalAndView.setViewName(viewName);
        modalAndView.setModalMap(modalMap);

        return modalAndView;
    }
}
